package com.sky.controller.admin;

import com.sky.mapper.OrdersMapper;
import com.sky.result.Result;
import com.sky.service.ReportService;
import com.sky.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * @Description
 * @Author shh
 * @Date 2025-10-15
 */
@Slf4j
@RestController
@RequestMapping("/admin/report")
@Api(tags = "报表相关接口")
public class ReportController {

    @Autowired
    private ReportService reportService;
    @Autowired
    private OrdersMapper ordersMapper;

    //营业额统计
    @ApiOperation("获取营业额统计")
    @GetMapping("/turnoverStatistics")
    public Result getTurnoverStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
        //参数为日期时，需要在参数上添加@DateTimeFormat注解，指定日期格式
        log.info("begin:{}, end:{}", begin, end);
        TurnoverReportVO vo = reportService.getTurnoverStatistics(begin, end);
        return Result.success(vo);
    }


    /**
     * 获取用户统计
     *
     * @param begin
     * @param end
     * @return
     */
    @ApiOperation("获取用户统计")
    @GetMapping("/userStatistics")
    public Result userStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
        log.info("begin:{}, end:{}", begin, end);
        UserReportVO vo = reportService.getUserStatistics(begin, end);
        return Result.success(vo);
    }

    /**
     * 获取订单统计
     *
     * @param begin
     * @param end
     * @return
     */
    @ApiOperation("获取订单统计")
    @GetMapping("/ordersStatistics")
    public Result ordersStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
        //参数为日期时，需要在参数上添加@DateTimeFormat注解，指定日期格式
        log.info("begin:{}, end:{}", begin, end);
        OrderReportVO vo = reportService.ordersStatistics(begin, end);
        return Result.success(vo);
    }
    /**
     * 获取top10订单
     *
     * @return
     */
    @ApiOperation("获取top10订单")
    @GetMapping("/top10")
    public Result top10(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){
        log.info("begin:{}, end:{}", begin, end);
        SalesTop10ReportVO vo = reportService.getTop10Orders(begin, end);
        return Result.success(vo);
    }

     /**
     * 导出订单数据
     * @return
     */
    @ApiOperation("导出订单数据")
    @GetMapping("/export")
    public void export(HttpServletResponse response) throws IOException {//为什么用HttpServletResponse：因为要将数据写入到响应体中。
        //不能直接使用输入输出流吗？因为要将数据写入到响应体中，而不是直接返回给客户端。
        //听不明白为什么要使用HttpServletResponse，而不是直接使用输入输出流。
        //因为要将数据写入到响应体中，而不是直接返回给客户端。
        log.info("导出订单数据");
        reportService.export(response);
    }

}
